import pickle
import base64
from django_redis import get_redis_connection


def merge_cookie_to_redis(request, user, response):
    """
    1.获取到cookie值
    2.如果存在cookie值，将cookie值直接合并到redis中
          1.对cookie值进行解码，解密
          2.获取redis中的hash和set中的sku_id
          3.取出cookie中的所有sku_id,count,selected
          4.遍历cookie中的所有sku_id,判断是否在redis中，更新数据
          5.将更新好的数据保存到redis中
          6.返回response
    3.如果不存在，直接返回response
    """
    # 1.获取到cookie值
    cookie_str = request.COOKIES.get('cart')
    # 2.如果存在cookie值，将cookie值直接合并到redis中
    if cookie_str is not None:
        # 1.对cookie值进行解码，解密
        cookie_cart = pickle.loads(base64.b64decode(cookie_str))
        # 2.连接redis数据库，获取redis数据库中的数据
        redis_conn = get_redis_connection('cart')
        redis_cart = redis_conn.hgetall('cart_%s' % user.id)
        redis_selected_ids = redis_conn.smembers('cart_selected_%s' % user.id)
        # 3. 初始化cart
        cart = {}
        # 4. 由于redis中的数据是byte类型，需要转变格式
        for sku_id, count in redis_cart.items():
            cart[sku_id.decode()] = int(count)
        selected_ids = []
        for sku_id in redis_selected_ids:
            selected_ids.append(int(sku_id))
        # 5. 遍历cookie中的所有商品，如果redis中存在，以redis为准
        # cookie_cart: {sku_id:{'count':count,'selected':True}}
        for sku_id, count_selected in cookie_cart.items():
            cart[sku_id] = count_selected['count']
            if count_selected['selected']:
                selected_ids.append(sku_id)
        redis_conn.hmset('cart_%s' % user.id, cart)
        redis_conn.sadd('cart_selected_%s' % user.id, *selected_ids)
        # 6. 合并后删除cookie中的数据
        response.delete_cookie('cart')
        # 7. 返回response
        return response
    else:
        return response
